export const CONTENT_TYPE = 'Content-Type';

/**
 * 获取响应结果的媒体类型（Content-Type）
 * @param res 响应结果
 * @return Content-Type字符串
 */
export function getType(res) {
    return res.headers.get(CONTENT_TYPE);
}

/**
 * 判断结果是否为JSON格式
 * @param res 响应结果
 * @param type 原始Content-Type字符串
 */
export function isJson(res, type) {
    type = type || getType(res);
    if (type && type.indexOf('json') > -1) {
        return res.isJson = true;
    }
}

/**
 * 判断结果是否为文本格式
 * @param res 响应结果
 * @param type 原始Content-Type字符串
 */
export function isText(res, type) {
    type = type || getType(res);
    if (type && (
        type.indexOf('text') > -1 ||
        type.indexOf('plain') > -1)) {
        return res.isText = true;
    }
}

/**
 * 解析AJAX响应结果
 * @param res 响应结果
 * @returns {JSON|string} 根据媒体类型返回JSON对象或文本内容
 */
export function parseResponse(res) {
    const body = isJson(res) ? res.json() : res.text();
    return body.then(data => ({res, data}));
}

/**
 * 解析AJAX响应结果
 * @param res 响应结果
 * @returns {{status, message}} 错误对象
 */
/* eslint no-plusplus: 0 */
function parseError(res) {
    const error = {};
    if (typeof res === 'object') {
        let stage = 0;
        for (const key in res) {
            const value = res[key];
            switch (key) {
            case 'code':
            case 'status':
                if (typeof value === 'number') {
                    error.status = value;
                    ++stage;
                }
                break;
            case 'text':
            case 'message':
            case 'statusText':
                if (typeof value === 'string') {
                    error.message = value;
                    ++stage;
                }
                break;
            }
            if (stage === 2) break;
        }
    } else if (typeof res === 'string') {
        error.message = res;
    }
    return error;
}

/**
 * 检测AJAX返回状态码
 * @param result 响应解析结果
 * @returns {res} 如不在[200,300]之间则抛出错误对象（{status,message}）
 */
export function checkStatus(result) {
    const {res, data} = result;
    if (res.ok) {
        return data;
    }
    let err = {};
    if (res.isJson) {
        err = parseError(data);
    } else if (isText(res)) {
        err.message = data;
    }
    if (!err.status) {
        err.status = res.status;
    }
    if (!err.message) {
        err.message = res.statusText;
    }
    throw err;
}

import {map, compact} from 'lodash';

export function makeQuery(query) {
    /* eslint array-callback-return: 0 */
    return compact(map(query, (value, key) => {
        if (value) {
            /*if (typeof value === 'boolean') {
             value = undefined; // true不直接显示
             }*/
            return compact([key, encodeURIComponent(value)]).join('=');
        }
    })).join('&');
}

/**
 * 生成带查询参数的URL
 * @param path 路径
 * @param query 查询参数对象
 * @returns {*}
 */
export function makeUrl(path, query) {
    if (Array.isArray(path)) {
        path = compact(path).join('/');
    }
    if (query) {
        //对_where特殊处理
        query._where = query._where && JSON.stringify(query._where);
        //_page特殊处理
        query._page = query._page && JSON.stringify(query._page);
    }
    const q = makeQuery(query);
    return compact([path, q]).join('?');
}
